/*************************************************
  * 描述：文件工具公共类
  *
  * File：fileutil_p.h
  * Author：chenyujin@mozihealthcare.cn
  * Date：2025/9/4
  * Update：
  * ************************************************/
#ifndef COREXI_COMMON_PC_FILEUTIL_P_H
#define COREXI_COMMON_PC_FILEUTIL_P_H
#include <QImage>
#include <common/fileutil/fileutil.h>
#include <filesystem>
#include <mutex>
#include <zip.h>


namespace fs = std::filesystem;
class FileUtilPrivate
{
public:
	/**
	 * 压缩文件
	 * @param srcPath 源文件路径
	 * @param destPath 目标文件路径
	 * @return	是否成功
	 */
	static bool zipFile(const std::string& srcPath, const std::string& destPath);

	/**
	 * 解压文件
	 * @param srcPath 源文件路径
	 * @param destPath 目标文件路径
	 * @return	是否成功
	 */
	static bool unZipFile(const std::string& srcPath, const std::string& destPath);

	static std::vector<unsigned char> getFileBytes(const std::string& filePath);

	static bool isUrl(const std::string& url);
	/**
	 * 获取路径的系统图标(包含url)
	 * @param  filePath 文件路径/url
	 * @return 系统图标
	 */
	static QImage getFileIcon(const std::string& filePath);
	/**
	 * 获取图片
	 * @param filePath 文件路径
	 * @return	图片
	 */
	static QImage getImage(const std::string& filePath);

private:
	/**
	 * 压缩单个文件
	 * @param sourceFilePath 源文件路径
	 * @param zipFilePath 压缩文件路径
	 */
	static void CompressFile(const std::filesystem::path& sourceFilePath, const std::filesystem::path& zipFilePath);

	/**
	 * 压缩目录
	 * @param directoryPath 源目录路径
	 * @param zipFilePath 压缩文件路径
	 */
	static void CompressDirectory(const std::filesystem::path& directoryPath, const std::filesystem::path& zipFilePath);

	/**
	 * 添加单个文件到zip中
	 * @param sourceFilePath 源文件路径
	 * @param relativeName 源文件相对路径
	 * @param zipArchive zip文件句柄
	 */
	static void AddFile2Zip(const std::filesystem::path& sourceFilePath, const char* relativeName, zip_t* zipArchive);

	/**
	 * 递归将目录结构添加到zip中
	 * @param rootDirectoryPath 源目录路径
	 * @param directoryPath 源目录路径
	 * @param zipArchive zip文件句柄
	 */
	static void AddDirectory2Zip(const std::filesystem::path& rootDirectoryPath, const std::filesystem::path& directoryPath, zip_t* zipArchive);

	/**
	 * 解压提取zip内容到指定目录
	 * @param zipFilePath 源文件路径
	 * @param outputDir 解压目录
	 */
	static void ExtractZip(const std::filesystem::path& zipFilePath,
						   const std::filesystem::path& outputDir);

	static QImage getIconFromUrl(const std::string& url);

private:
	static std::mutex m_fileLocker;// 文件锁
};

#endif//COREXI_COMMON_PC_FILEUTIL_P_H
